perm filename GFTODO.DIF[MF,ALS] blob sn#797954 filedate 1985-07-02 generic text, type T, neo UTF8
  1) GFTODO.OLD[MF,ALS] and 2) GFD.WEB[MF,ALS]	7-02-85 08:24	pages 1,1

**** File 1) GFTODO.OLD[MF,ALS]/1P/4L
1)	C00003 00002	% This program is based on GFtype and in part contains material extracted from
1)	C00007 00003	@* Introduction.
**** File 2) GFD.WEB[MF,ALS]/1P/4L
2)	C00003 00002	% This program by A. L. Samuel is not copyrighted and can be used freely.
2)	C00007 00003	@* Introduction.
***************


**** File 1) GFTODO.OLD[MF,ALS]/1P/9L
1)	C00053 00007	@* Input and Output for binary files.
1)	C00063 00008	@* Reading the gf information.
1)	C00071 00009	@* Translating the input commands.  This section will be largely concerned with
1)	C00077 00010	@* Processing and writing out the raster information.
1)	C00086 00011	@ Reading the postamble.
1)	C00092 00012	@* OC file format.
1)	C00111 00013	@* The main program.
1)	C00117 00014	@* Index.
1)	C00118 ENDMK
1)	C⊗;
1)	% This program is based on GFtype and in part contains material extracted from
**** File 2) GFD.WEB[MF,ALS]/1P/9L
2)	C00055 00007	@* Input and Output for binary files.
2)	C00065 00008	@* Reading the gf information.
2)	C00075 00009	@* Translating the input commands.
2)	C00081 00010	@* Processing and writing out the raster information.
2)	C00090 00011	@ Reading the postamble.
2)	C00096 00012	@* OC file format.
2)	C00115 00013	@* The main program.
2)	C00122 00014	@* Index.
2)	C00123 ENDMK
2)	C⊗;
2)	% This program by A. L. Samuel is not copyrighted and can be used freely.
2)	% This program is based on GFtype and in part contains material extracted from
***************


**** File 1) GFTODO.OLD[MF,ALS]/2P/6L
1)	% Here is TeX material that gets inserted after \input webmac
**** File 2) GFD.WEB[MF,ALS]/2P/7L
2)	% Version 0.3 to be issued in July 1985 is updated to accept the early 1985
2)	%  changes in the GF format that were incorporated in DVIIMP.
2)	%  Much of what is new is adapted from DVIIMP Version 0.91.
2)	% Here is TeX material that gets inserted after \input webmac
***************


**** File 1) GFTODO.OLD[MF,ALS]/2P/36L
  1) GFTODO.OLD[MF,ALS] and 2) GFD.WEB[MF,ALS]	7-02-85 08:24	pages 2,2

1)		\centerline{(Version 0.2, December 1984)}
1)		\vfill}
**** File 2) GFD.WEB[MF,ALS]/2P/40L
2)		\centerline{(Version 0.3, July 1985)}
2)		\vfill}
***************


**** File 1) GFTODO.OLD[MF,ALS]/3P/12L
1)	during early December 1984 and it expects the identification byte, |i|,
1)	to be 130.
1)	The |banner| string defined here should be changed whenever \.{GFtoDOVER}
1)	gets modified.
1)	@d banner=='This is GFtoDOVER, Version 0.2' {printed when the program starts}
1)	@d resolution==384.0  {pixels per inch, as used in gf files}
**** File 2) GFD.WEB[MF,ALS]/3P/12L
2)	during early 1985 and it expects the identification byte, |i|,
2)	to be 131.
2)	The |banner| string defined here should be changed whenever \.{GFtoDOVER}
2)	gets modified.
2)	@d banner=='This is GFtoDOVER, Version 0.3' {printed when the program starts}
2)	@d resolution==384.0  {pixels per inch, as used in gf files}
***************


**** File 1) GFTODO.OLD[MF,ALS]/6P/9L
1)	by \MF; and, in fact, the file formats have a lot in common.
1)	It is therefore not surprising that \.{GFtype} is identical in many
1)	respects to the \.{DVItype} program.
1)	A \.{GF} file is a stream of 8-bit bytes that may be
**** File 2) GFD.WEB[MF,ALS]/6P/9L
2)	by \MF. and, in fact, the file formats have a lot in common.
2)	A \.{GF} file is a stream of 8-bit bytes that may be
***************


**** File 1) GFTODO.OLD[MF,ALS]/6P/29L
1)	first.  Each ``character'' consists of a |boc| command, followed by any
1)	number of other commands that specify ``black'' pixels,
1)	followed by an |eoc| command. The characters appear in the order that \MF\
**** File 2) GFD.WEB[MF,ALS]/6P/27L
2)	first.  Each ``character'' consists of a |boc| or a |boc1|
2)	command, followed by any
2)	number of other commands that specify ``black'' and ``white'' pixels,
2)	followed by an |eoc| command. The characters appear in the order that \MF\
***************


  1) GFTODO.OLD[MF,ALS] and 2) GFD.WEB[MF,ALS]	7-02-85 08:24	pages 6,6

**** File 1) GFTODO.OLD[MF,ALS]/6P/34L
1)	|boc| command, or by a |post| command; in the latter case, there are no
1)	more characters in the file, and the remaining bytes form the postamble.
**** File 2) GFD.WEB[MF,ALS]/6P/33L
2)	|boc| or a |boc1|
2)	command, or by a |post| command; in the latter case, there are no
2)	more characters in the file, and the remaining bytes form the postamble.
***************


**** File 1) GFTODO.OLD[MF,ALS]/6P/118L
1)	\yskip\hang|eoc| 68. End of character: All pixels blackened so far
1)	constitute the pattern for this character. In particular, a completely
1)	blank character might have |eoc| immediately following |boc|.
1)	\yskip\hang|skip0| 69. Decrease |n| by 1 and set |m←min_m|,
1)	|paint_switch←white|. \ (This finishes one row and begins another,
1)	ready to whiten the leftmost pixel in the new row.)
1)	\yskip\hang|skip1| 70 |d[1]|. Decrease |n| by |d+1|, set |m←min_m|, and set
1)	|paint_switch←white|. This is a way to produce |d| all-white rows.
1)	\yskip\hang|@!skip2| 71 |d[2]|. Same as |skip1|, but |d| can be as large
1)	as 65535.
1)	\yskip\hang|@!skip3| 72 |d[3]|. Same as |skip1|, but |d| can be as large
1)	as $2↑{24}-1$. \MF\ obviously never needs this command.
1)	\yskip\hang|new_row_0| 73. Decrease |n| by 1 and set |m←min_m|,
1)	|paint_switch←black|. \ (This finishes one row and begins another,
1)	ready to {\sl blacken\/} the leftmost pixel in the new row.)
1)	\yskip\hang|@!new_row_1| through |@!new_row_165| (opcodes 74 to 238). Same as
1)	|new_row_0|, but with |m←min_m+1| through |min_m+165|, respectively.
1)	\yskip\hang|xxx1| 239 |k[1]| |x[k]|. This command is undefined in
**** File 2) GFD.WEB[MF,ALS]/6P/118L
2)	\yskip\hang|boc1| 68 |c[1]| |@!del_m[1]| |max_m[1]| |@!del_n[1]| |max_n[1]|.
2)	Same as |boc|, but |p| is assumed to be~$-1$; also |del_m=max_m-min_m|
2)	and |del_n=max_n-min_n| are given instead of |min_m| and |min_n|.
2)	The one-byte parameters must be between 0 and 255, inclusive.
2)	\ (This abbreviated |boc| saves 19~bytes per character, in common cases.)
2)	\yskip\hang|eoc| 69. End of character: All pixels blackened so far
2)	constitute the pattern for this character. In particular, a completely
2)	blank character might have |eoc| immediately following |boc|.
2)	\yskip\hang|skip0| 70. Decrease |n| by 1 and set |m←min_m|,
2)	|paint_switch←white|. \ (This finishes one row and begins another,
2)	ready to whiten the leftmost pixel in the new row.)
2)	\yskip\hang|skip1| 71 |d[1]|. Decrease |n| by |d+1|, set |m←min_m|, and set
2)	|paint_switch←white|. This is a way to produce |d| all-white rows.
2)	\yskip\hang|@!skip2| 72 |d[2]|. Same as |skip1|, but |d| can be as large
2)	as 65535.
2)	\yskip\hang|@!skip3| 73 |d[3]|. Same as |skip1|, but |d| can be as large
2)	as $2↑{24}-1$. \MF\ obviously never needs this command.
2)	\yskip\hang|new_row_0| 74. Decrease |n| by 1 and set |m←min_m|,
  1) GFTODO.OLD[MF,ALS] and 2) GFD.WEB[MF,ALS]	7-02-85 08:24	pages 6,6

2)	|paint_switch←black|. \ (This finishes one row and begins another,
2)	ready to {\sl blacken\/} the leftmost pixel in the new row.)
2)	\yskip\hang|@!new_row_1| through |@!new_row_164| (opcodes 75 to 238). Same as
2)	|new_row_0|, but with |m←min_m+1| through |min_m+164|, respectively.
2)	\yskip\hang|xxx1| 239 |k[1]| |x[k]|. This command is undefined in
***************


**** File 1) GFTODO.OLD[MF,ALS]/6P/172L
1)	\yskip\hang|@!char_loc0| 246 |c[1]| |dx[4]| |w[4]| |p[4]|.
1)	Same as |char_loc|, except that |dy| is assumed to be zero.
1)	\yskip\hang|pre| 247 |i[1]| |k[1]| |x[k]|.
**** File 2) GFD.WEB[MF,ALS]/6P/178L
2)	\yskip\hang|@!char_loc0| 246 |c[1]| |@!dm[1]| |w[4]| |p[4]|.
2)	Same as |char_loc|, except that |dy| is assumed to be zero, and the value
2)	of~|dx| is taken to be |65536*dm|, where |0≤dm<256|.
2)	\yskip\hang|pre| 247 |i[1]| |k[1]| |x[k]|.
***************


**** File 1) GFTODO.OLD[MF,ALS]/6P/178L
1)	130. The other information is merely commentary; it is not given
1)	special interpretation like \\{xxx} commands are. (Note that \\{xxx}
**** File 2) GFD.WEB[MF,ALS]/6P/185L
2)	131. The other information is merely commentary; it is not given
2)	special interpretation like \\{xxx} commands are. (Note that \\{xxx}
***************


**** File 1) GFTODO.OLD[MF,ALS]/6P/188L
1)	@d gf_id_byte=130 {identifies the kind of \.{GF} files described here}
1)	@ Here are the opcodes that \.{GFtoDOVER} actually refers to.
1)	@d paint_0=0 {beginning of the \\{paint} commands}
**** File 2) GFD.WEB[MF,ALS]/6P/195L
2)	@d gf_id_byte=131 {identifies the kind of \.{GF} files described here}
2)	@ Here are the opcodes that \.{GFtoDO} actually refers to.
2)	@d paint_0=0 {beginning of the \\{paint} commands}
***************


**** File 1) GFTODO.OLD[MF,ALS]/6P/195L
1)	@d boc=67 {beginning of a character}
1)	@d eoc=68 {end of a character}
1)	@d skip0=69 {skip no blank rows}
1)	@d skip1=70 {skip over blank rows}
1)	@d new_row_0=73 {move down one row and then right}
1)	@d xxx1=239 {for \&{special} strings}
**** File 2) GFD.WEB[MF,ALS]/6P/202L
  1) GFTODO.OLD[MF,ALS] and 2) GFD.WEB[MF,ALS]	7-02-85 08:24	pages 6,6

2)	@d paint2=65
2)	@d boc=67 {beginning of a character}
2)	@d boc1=68 {abbreviated |boc|}
2)	@d eoc=69 {end of a character}
2)	@d skip0=70 {skip no blank rows}
2)	@d skip1=71 {skip over blank rows}
2)	@d skip2=72 {skip over blank rows}
2)	@d new_row_0=74 {move down one row and then right}
2)	@d new_row_164=238 {move down 164 rows and then right}
2)	@d xxx1=239 {for \&{special} strings}
***************


**** File 1) GFTODO.OLD[MF,ALS]/6P/269L
1)	Pointer |p| might be |-1| if the character exists in the \.{TFM} file
**** File 2) GFD.WEB[MF,ALS]/6P/279L
2)	@↑oriental characters@>@↑Chinese characters@>@↑Japanese characters@>
2)	Pointer |p| might be |-1| if the character exists in the \.{TFM} file
***************


**** File 1) GFTODO.OLD[MF,ALS]/6P/277L
1)	comes next; this currently equals~130, as in the preamble.
1)	The |i| byte is followed by four or more bytes that are all equal to
**** File 2) GFD.WEB[MF,ALS]/6P/289L
2)	comes next; this currently equals~131, as in the preamble.
2)	The |i| byte is followed by four or more bytes that are all equal to
***************


**** File 1) GFTODO.OLD[MF,ALS]/8P/73L
1)	@d thirty_eight_cases(#)==thirty_two_cases(#),four_cases(#+32),#+36,#+37
1)	@d sixty_four_cases(#)==thirty_two_cases(#),thirty_two_cases(#+32)
1)	@p function first_par(o:eight_bits):integer;
**** File 2) GFD.WEB[MF,ALS]/8P/73L
2)	@d thirty_seven_cases(#)==thirty_two_cases(#),four_cases(#+32),#+36
2)	@d sixty_four_cases(#)==thirty_two_cases(#),thirty_two_cases(#+32)
2)	@d one_sixty_five_cases(#)==
2)		sixty_four_cases(#), sixty_four_cases(#+64),
2)		thirty_seven_cases(#+128)
2)	@p function first_par(o:eight_bits):integer;
***************


**** File 1) GFTODO.OLD[MF,ALS]/8P/80L
1)	paint1+1,skip1+1,xxx1+1: first_par←get_two_bytes;
1)	paint1+2,skip1+2,xxx1+2: first_par←get_three_bytes;
1)	xxx1+3,yyy: first_par←signed_quad;
  1) GFTODO.OLD[MF,ALS] and 2) GFD.WEB[MF,ALS]	7-02-85 08:24	pages 8,8

1)	boc,eoc,skip0,no_op,pre,post,post_post,undefined_commands: first_par←0;
1)	sixty_four_cases(new_row_0), sixty_four_cases(new_row_0+64),
1)		thirty_eight_cases(new_row_0+128): first_par←o-new_row_0;
1)	end;
**** File 2) GFD.WEB[MF,ALS]/8P/83L
2)	paint2,skip2,xxx1+1: first_par←get_two_bytes;
2)	paint1+2,skip1+2,xxx1+2: first_par←get_three_bytes;
2)	xxx1+3,yyy: first_par←signed_quad;
2)	boc,boc1,eoc,skip0,no_op,pre,post,post_post,undefined_commands: first_par←0;
2)	one_sixty_five_cases(new_row_0): first_par←o-new_row_0;
2)	end;
***************


**** File 1) GFTODO.OLD[MF,ALS]/9P/1L
1)	@* Translating the input commands.  This section will be largely concerned with
1)	the reading of the input commands and the storing of this information in a
**** File 2) GFD.WEB[MF,ALS]/9P/1L
2)	@* Translating the input commands.
2)	This section will be largely concerned with
2)	the reading of the input commands and the storing of this information in a
***************


**** File 1) GFTODO.OLD[MF,ALS]/9P/13L
1)	sixty_four_cases(new_row_0), sixty_four_cases(new_row_0+64),
1)	 thirty_eight_cases(new_row_0+128):
1)		@<Translate a |new_row| command@>;
1)	@t\4@>@<Cases for commands |no_op|, |pre|, |post|, |post_post|, |boc|,
1)		and |eoc|@>@;
1)	four_cases(xxx1): @<Translate an |xxx| command@>;
**** File 2) GFD.WEB[MF,ALS]/9P/14L
2)	one_sixty_five_cases(new_row_0): @<Translate a |new_row| command@>; 
2)	@t\4@>@<Cases for commands |no_op|, |pre|, |post|, |post_post|, |boc|,
2)		|boc1|,	and |eoc|@>@;
2)	four_cases(xxx1): @<Translate an |xxx| command@>;
***************


**** File 1) GFTODO.OLD[MF,ALS]/9P/33L
1)	boc: begin error('boc occurred before eoc!'); goto 9998;
1)	@.boc occurred before eoc@>
**** File 2) GFD.WEB[MF,ALS]/9P/32L
2)	boc,boc1: begin error('boc or boc1 occurred before eoc!'); goto 9998;
2)	@.boc occurred before eoc@>
***************


  1) GFTODO.OLD[MF,ALS] and 2) GFD.WEB[MF,ALS]	7-02-85 08:24	pages 11,11

**** File 1) GFTODO.OLD[MF,ALS]/11P/20L
1)	@<Make sure that the end of the file is well-formed@>;
1)	end;
**** File 2) GFD.WEB[MF,ALS]/11P/20L
2)	end;
***************


**** File 1) GFTODO.OLD[MF,ALS]/11P/41L
1)	@ When we get to the present code, the |post_post| command has
**** File 2) GFD.WEB[MF,ALS]/11P/39L
2)	@!del_m:integer; {used to hold |gf| parameter}
2)	@!del_n:integer; {used to hold |gf| parameter}
2)	@ When we get to the present code, the |post_post| command has
***************


**** File 1) GFTODO.OLD[MF,ALS]/11P/64L
1)	@ @<Process the character locations...@>=
1)	repeat k←get_byte;
**** File 2) GFD.WEB[MF,ALS]/11P/65L
2)	@ @<Process the character locations in the postamble@>=
2)	repeat k←get_byte;
***************


**** File 1) GFTODO.OLD[MF,ALS]/11P/68L
1)	  c←first_par(k); dx[c]←signed_quad;
1)	  if k=char_loc then dy←signed_quad else dy←0;
1)		if c>max_glyph_no then abort('Character number too large');
1)		tfm_width[c]←signed_quad;
1)		if tfm_width[c]<tfm_min then tfm_min←tfm_width[c];
1)		if tfm_width[c]>tfm_max then tfm_max←tfm_width[c];
1)		p←signed_quad;
1)		k←no_op;
1)		end;
1)	until k≠no_op;
**** File 2) GFD.WEB[MF,ALS]/11P/69L
2)	  c←get_byte;
2)	  if c<bc then bc←c; if c>ec then ec←c;
2)	  if k=char_loc then
2)	    begin  dx[c]←signed_quad div 65536; dy←signed_quad;
2)	    end
2)	  else begin dx[c]←get_byte; dy←0;
2)	    end;
2)	tfm_width[c]←signed_quad;
2)	{|print_ln(' k=',k:1,' c=',c:1,' dx=',dx[c]:1,' tfm width=',tfm_width[c]:1);|}
2)	if tfm_width[c]<tfm_min then tfm_min←tfm_width[c];
  1) GFTODO.OLD[MF,ALS] and 2) GFD.WEB[MF,ALS]	7-02-85 08:24	pages 11,11

2)	if tfm_width[c]>tfm_max then tfm_max←tfm_width[c];
2)	p←signed_quad;
2)	  k←no_op;
2)	  end;
2)	until k≠no_op;
***************


**** File 1) GFTODO.OLD[MF,ALS]/13P/52L
1)			begin if o≠boc then
1)				bad_gf('byte ',cur_loc-1:1,' is not boc (',o:1,')');
1)			print(' [');
1)			@<Pass a |boc| command@>;
1)			if not do_char then bad_gf('char ended unexpectedly');
**** File 2) GFD.WEB[MF,ALS]/13P/52L
2)			begin if (o<boc) or (o>boc1) then
2)				bad_gf('byte ',cur_loc-1:1,' is not boc (',o:1,')');
2)			print(' [');
2)			@<Pass a |boc| or a |boc1| command@>;
2)			if not do_char then bad_gf('char ended unexpectedly');
***************


**** File 1) GFTODO.OLD[MF,ALS]/13P/84L
1)	char_code←signed_quad;
1)	p←signed_quad;
1)	c←char_code mod 256;
1)	if c<0 then c←c+256;
1)	print(c:1);
1)	if char_code≠c then
1)		print(' in family ',(char_code-c) div 256 : 1);
1)	min_m_stated←signed_quad; max_m_stated←signed_quad;
1)	min_n_stated←signed_quad; max_n_stated←signed_quad;
1)	p_save←max_m_stated; 
1)	skip_flag←true; {a |paint| commasnd to follow will be to paint white}
1)	if char_ptr[c]≠p then
**** File 2) GFD.WEB[MF,ALS]/13P/84L
2)	if o=boc then
2)	    begin
2)	    char_code←signed_quad;
2)	    p←signed_quad;
2)	    c←char_code mod 256;
2)	    if c<0 then c←c+256;
2)	    print(c:1);
2)	    if char_code≠c then
2)		    print(' in family ',(char_code-c) div 256 : 1);
2)	    min_m_stated←signed_quad; max_m_stated←signed_quad;
2)	    min_n_stated←signed_quad; max_n_stated←signed_quad;
  1) GFTODO.OLD[MF,ALS] and 2) GFD.WEB[MF,ALS]	7-02-85 08:24	pages 13,13

2)	    end
2)	else begin
2)	    char_code←get_byte;
2)	    p←-1;
2)	    c←char_code;
2)	    print(c:1);
2)	    del_m←get_byte; max_m_stated←get_byte;
2)	    del_n←get_byte; max_n_stated←get_byte;
2)	    min_m_stated←max_m_stated-del_m;
2)	    min_n_stated←max_n_stated-del_n;
2)	    end;
2)	m←min_m_stated; n←max_n_stated;
2)	p_save←max_m_stated; 
2)	skip_flag←true; {a |paint| command to follow will be to paint white}
2)	if char_ptr[c]≠p then
***************


**** File 1) GFTODO.OLD[MF,ALS]/13P/99L
1)	m←min_m_stated; n←max_n_stated;
1)	p_c←0; p_val←white; p_array←0; paint_array[n,p_c+1]←0;
**** File 2) GFD.WEB[MF,ALS]/13P/113L
2)	p_c←0; p_val←white; p_array←0; paint_array[n,p_c+1]←0;
***************